唯品秀前端博客

此处的“hack”并非是网络中很神秘的组织“黑客”,而是使用他们可以帮助你解决浏览器下一些怪异和特殊的bug。很多时候对于这样的讨论也非常多,比如说在您的代码中应不应该使用hack?甚至延伸到使用“hack”是一个优秀的前端人员?其实,有时候是逼不得以,必须为之。你可以简单的把它理解为类似css响应式媒体查询的一种,当然,它还能支持html文件作条件渲染。

一、Chrome浏览器

选择器Hack

1
2
3
4
/* Chrome 24- and Safari 5- */
::made-up-pseudo-element, .selector {
  代码放在这里
}

媒体查询Hacks

1
2
3
4
/* Chrome, Safari 3+ */
@media screen and (-webkit-min-device-pixel-ratio:0) {
  代码放在这里   
}

JavaScript Hack

1
2
/* Chrome */
var isChrome = Boolean(window.chrome);

二、Firefox浏览器

属性选择器Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* Firefox 1.5 */
body:empty .selector {
 样式代码放这里

/* Firefox 2+ */
.selector, x:-moz-any-link {
 样式代码放这里 
}
/* Firefox 3+ */
.selector, x:-moz-any-link; x:default {
 样式代码放这里 
}
/* Firefox 3.5+ */
body:not(:-moz-handler-blocked) .selector {
 样式代码放这里 
}  
}

媒体查询Hack

1
2
3
4
5
6
7
8
9
10
11
12
/* Firefox 3.5+, IE 9/10, Opera */
@media screen and (min-resolution: +72dpi) {
 样式代码放这里     
}
/* Firefox 3.6+ */
@media screen and (-moz-images-in-menus:0) {
 样式代码放这里     
}
/* Firefox 4+ */
@media screen and (min--moz-device-pixel-ratio:0) {
 样式代码放这里     
}

JavaScript Hack

1
2
3
4
5
6
7
8
9
10
11
/* Firefox */
var isFF = !!navigator.userAgent.match(/firefox/i);

/* Firefox 2 - 13 */
var isFF = Boolean(window.globalStorage);

/* Firefox 2/3 */
var isFF = /a/[-1]=='a';

/* Firefox 3 */
var isFF = (function x(){})[-5]=='x';

混合型Hack

1
2
3
4
/* Firefox 3+ */
@-moz-document url-prefix() {
 样式代码放这里     
}

三、Opera浏览器

属性选择器Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Opera 9.25, Safari 2/3.1 */
*|html[xmlns*=""] .selector {
 样式代码放这里 
}

/* Opera 9.27 and below, Safari 2 */
html:first-child .selector {
 样式代码放这里 
}

/* Opera 9.5+ */
noindex:-o-prefocus, .selector {
 样式代码放这里 
}

媒体查询Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* Opera 7 */
@media all and (min-width: 0px){
 样式代码放这里     
}

/* Opera 12- */
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {
 样式代码放这里     
}

/* Opera, Firefox 3.5+, IE 9/10 */
@media screen and (min-resolution: +72dpi) {
 样式代码放这里     
}

/* Opera, IE 8/9/10 */
@media screen {
 样式代码放这里     
}

JavaScript Hack

1
2
3
4
5
/* Opera 9.64- */
var isOpera = /^function \(/.test([].sort);

/* Opera 12- */
var isOpera = Boolean(window.opera);

四、Safari浏览器

属性选择器Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* Safari 2/3 */
html[xmlns*=""] body:last-child .selector {
 样式代码放这里     
}
html[xmlns*=""]:root .selector  {
 样式代码放这里     
}

/* Safari 2/3.1, Opera 9.25 */
*|html[xmlns*=""] .selector {
 样式代码放这里     
}

/* Safari 5- and Chrome 24- */
::made-up-pseudo-element, .selector {
 样式代码放这里     
}

媒体查询Hack

1
2
/* Safari */
var isSafari = /a/.__proto__=='//';

五、IE浏览器

选择器Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* IE 6 and below */
* html .selector  {
 样式代码放这里     
}
.suckyie6.selector {
 样式代码放这里     
} /* .suckyie6 can be any unused class */

/* IE 7 and below */
.selector, {
 样式代码放这里     
}

/* IE 7 */
*:first-child+html .selector {
  样式代码放这里
}
.selector, x:-IE7 {
 样式代码放这里     
}
*+html .selector {
 样式代码放这里     
}

/* Everything but IE 6 */
html > body .selector {
 样式代码放这里     
}

/* Everything but IE 6/7 */
html > /**/ body .selector {
  样式代码放这里
}
head ~ /* */ body .selector {
 样式代码放这里     
}

/* Everything but IE 6/7/8 */
:root *> .selector {
 样式代码放这里     
}
body:last-child .selector {
 样式代码放这里     
}
body:nth-of-type(1) .selector {
 样式代码放这里     
}
body:first-of-type .selector {
 样式代码放这里     
}

属性/属性值 Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* IE 6 */
.selector { _color: blue; }
.selector { -color: blue; }

/* IE 6/7 - any combination of these characters:
 ! $ & * ( ) = % + @ , . / ` [ ] # ~ ? : <  > | */

.selector { !color: blue; }
.selector { $color: blue; }
.selector { &color: blue; }
.selector { *color: blue; }
/* ... */

/* IE 6/7 - acts as an !important */
.selector { color: blue !ie; }
/* string after ! can be anything */

/* IE 8/9 */
.selector { color: blue\0/; }
/* must go at the END of all rules */

/* IE 9/10 */
.selector:nth-of-type(1n) { color: blue\9; }

/* IE 6/7/8/9/10 */
.selector { color: blue\9; }
.selector { color/*\**/: blue\9; }

 /* Everything but IE 6 */
.selector { color/**/: blue; }

媒体查询Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/* IE 6/7 */
@media screen\9 {
 样式代码放这里     
}

/* IE 6/7/8 */
@media \0screen\,screen\9 {
 样式代码放这里     
}

/* IE 8 */
@media \0screen {
 样式代码放这里     
}

/* IE 8/9/10 & Opera */
@media screen\0 {
 样式代码放这里     
}

/* IE 9/10, Firefox 3.5+, Opera */
@media screen and (min-resolution: +72dpi) {
 样式代码放这里     
}

/* IE 9/10 */
@media screen and (min-width:0\0) {
 样式代码放这里     
}

/* IE 10+ */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
 样式代码放这里     
}

/* Everything but IE 6/7/8 */
@media screen and (min-width: 400px) {
 样式代码放这里     
}

JavaScript Hack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* IE <= 8 */
var isIE = '\v'=='v';  
/* IE 6 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 6]><i></i><![endif]-->";
var isIE = checkIE.getElementsByTagName("i").length == 1;  
/* IE 7 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 7]><i></i><![endif]-->";
var isIE = checkIE.getElementsByTagName("i").length == 1;
navigator.appVersion.indexOf("MSIE 7.")!=-1
/* IE 8 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 8]><i></i><![endif]-->";
var isIE = checkIE.getElementsByTagName("i").length == 1;  
/* IE 9 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 9]><i></i><![endif]-->";
var isIE = checkIE.getElementsByTagName("i").length == 1;  
/* IE 10 */
var isIE = eval("/*@cc_on!@*/false") && document.documentMode === 10;  

/* IE 10 */
var isIE = document.body.style.msTouchAction != undefined;

上面列出各个浏览器下hack的写法,当然在实际运用之中并不建议使用hack。如果你的页面需要hack来处理时,请先检查你的css或者js,如果实在无法达到要求,在考虑使用hack来处理。不只是如此,其实html也是可以有这类写法,该html文件只对IE9有效,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .holly-kefu-l {
            color: blue\9;
        }
    </style>
</head>

<body>
    <!--[if lte IE 9 ]>
    <div class="holly-kefu-l9">
        <span class="close-kefu-l9" title="关闭窗口">关闭</span>
    </div>
    <a class="online_chat-l9" id="get_chat-l9">
        <img src="/templets/default/images/online_chat.png" alt="在线客服" />
        <br/>
        <p>售前</p>
        <p>咨询</p>
    </a>
    < ![endif]-->
    <p class="holly-kefu-l">啥看法和撒谎的福克斯对方接口</p>
</body>
</html>

你甚至还可以这样

1
2
3
<!--[if lte IE 8 ]>
   <link rel="stylesheet" type="text/css" media="all" href="./assets/css/ie8.css" />
<![endif]-->
本站所有文章、图片、资源等如无特殊说明或标注,均为来自互联网或者站长原创,版权归原作者所有;仅作为个人学习、研究以及欣赏!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理,邮箱:343049466@qq.com
赞(3) 打赏
标签:

上一篇:

下一篇:

相关推荐

0 条评论关于"前端针对某个特殊浏览器做兼容(Hack)"

表情

最新评论

    暂无留言哦~~
谢谢你请我吃鸡腿*^_^*

支付宝扫一扫打赏

微信扫一扫打赏